package com.atguigu.juc.locks;

import java.util.concurrent.locks.ReentrantReadWriteLock;

/**
 * @author yanglin
 * @create 2024-02-07 17:04 星期三
 * description:  锁降级
 */
public class LockDownGradingDemo {

    /**
     *
     * 锁降级：将写锁降级为读锁  （目的是为了让当前线程感知到数据变化，保证数据的可见性）
     *      遵循获取写锁 --> 再获取读锁 --> 在释放写锁的次序  写锁能够降级成为读锁
     *         1、如果一个线程持有了写锁，在没有释放写锁的情况下，它可以继续获得读锁。这就是写锁的降级，降级成为了读锁
     *         2、规则惯例，先获取写锁，然后获取读锁，在释放写锁的次序
     *         3、如果释放了写锁，那么就完全转为读锁
     *
     *  读没有完成的时候，写锁无法获得，必须等到读锁读完后才有机会写
     *  
     *  总结：同一个线程自己持有写锁时，再去拿读锁，相当于重入锁
     *
     *
     */

    public static void main(String[] args) {
        ReentrantReadWriteLock readWriteLock = new ReentrantReadWriteLock();
        //读锁
        ReentrantReadWriteLock.ReadLock readLock = readWriteLock.readLock();
        //写锁
        ReentrantReadWriteLock.WriteLock writeLock = readWriteLock.writeLock();

        //A
//        writeLock.lock();
//        System.out.println("写入成功");
//        writeLock.unlock();

        //B
//        readLock.lock();
//        System.out.println("读取成功");
//        readLock.unlock();

        //同一个线程（锁降级：写锁可以降级为读锁）
//        writeLock.lock();
//        System.out.println("写入");
//        
//        readLock.lock();
//        System.out.println("读取");
//        
//        writeLock.unlock();
//        
//        readLock.unlock();


        //-------------------------------------------------

        //读锁不可以升级为写锁
        readLock.lock();
        System.out.println("读取");

        writeLock.lock();
        System.out.println("写入");



        writeLock.unlock();

        readLock.unlock();

    }


}
